use std::sync::{Arc, Mutex};
use std::thread;

fn main() {
    // arc是线程安全的引用计数容器，其包含的元素默认不可变。为了能在线程间安全的传递，使用了Mutex容器。Mutex是线程安全的互斥锁实现
    let mutex = Arc::new(Mutex::new(1));
    let c_mutex = mutex.clone();

    let _ = thread::spawn(move || {
        let mut data = c_mutex.lock().unwrap();
        *data = 2;
        panic!("oh no");
    })
    .join();

    // 判断mutex克隆出的引用是否在子线程发生了恐慌，
    assert_eq!(mutex.is_poisoned(), true);

    // 由于mutex在子线程已经发生了恐慌，所以在此处主线程进行lock时会获取到子线程返回的Err
    match mutex.lock() {
        Ok(_) => unreachable!(),
        Err(p_err) => {
            let data = p_err.get_ref();
            println!("recoverd:{}", data);
        }
    };
}
